#include "reel.h"
#include <iostream>

using namespace std;

reel::reel(double valeur) : noncomplexe(REEL){
        this->valeur = valeur;
this->type = REEL;
}

reel::reel(const entier& i) : noncomplexe(REEL){

this->type = REEL;
        this->valeur = i.getVal();
}

reel::reel(const rationnel& f) : noncomplexe(REEL){

this->type = REEL;
        this->valeur = (double)f.getNum()/(double)f.getDen();
}

constante* reel::operator+(const constante& c)const{
        switch(c.getType()){
                case constante::ENTIER:
        return *this+reel(static_cast<const entier&>(c));
                break;
                case constante::RATIONNEL:
        return *this+reel(static_cast<const rationnel&>(c));
                break;
                case constante::REEL:
        return new reel(this->valeur + static_cast<const reel&>(c).valeur);//*this+static_cast<const Reel&>(c);
                break;
        }
}

constante* reel::operator*(const constante& c)const{
        switch(c.getType()){
                case constante::ENTIER:
        return *this*reel(static_cast<const entier&>(c));
                break;
                case constante::RATIONNEL:
        return *this*reel(static_cast<const rationnel&>(c));
                break;
                case constante::REEL:
        return new reel(this->valeur * static_cast<const reel&>(c).valeur);//*this+static_cast<const Real&>(c);
                break;
        }
}
constante* reel::operator-(const constante& c)const{
        switch(c.getType()){
                case constante::ENTIER:
        return *this-reel(static_cast<const entier&>(c));
                break;
                case constante::RATIONNEL:
        return *this-reel(static_cast<const rationnel&>(c));
                break;
                case constante::REEL:
        return new reel(this->valeur - static_cast<const reel&>(c).valeur);//*this+static_cast<const Real&>(c);
                break;
        }
}

constante* reel::operator/(const constante& c)const{
        switch(c.getType()){
                case constante::ENTIER:
        return *this/reel(static_cast<const entier&>(c));
                break;
                case constante::RATIONNEL:
        return *this/reel(static_cast<const rationnel&>(c));
                break;
                case constante::REEL:
        return new reel(this->valeur / static_cast<const reel&>(c).valeur);//*this+static_cast<const Real&>(c);
                break;
        }
}

constante* reel::operator-()const{
        return new reel(-this->valeur);
}

